package org.pine.start.interceptor;

//import cn.dev33.satoken.stp.StpUtil;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.pine.common.annotation.WithoutLogin;
import org.pine.common.beans.LogId;
import org.pine.common.utils.UserUtil;
import org.springdoc.webmvc.api.MultipleOpenApiResource;
import org.springdoc.webmvc.api.OpenApiResource;
import org.springdoc.webmvc.ui.SwaggerConfigResource;
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 请求响应拦截器
 *
 * @author pine manage
 * @since 2024-08-14
 */
@Slf4j
public class RequestHolderHandlerInterceptor implements HandlerInterceptor {

//    @Resource
//    private SysUserService sysUserService;
//    @Resource
//    private SysRoleUserService sysRoleUserService;
//    @Resource
//    private SysRoleService sysRoleService;
//    @Resource
//    private SysDeptService sysDeptService;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod action) {
            WithoutLogin withoutLogin = action.getMethodAnnotation(WithoutLogin.class);
            if (withoutLogin != null) {
                return true;
            }
        } else {
            // 不是一个请求方法
            return true;
        }

        if (action.getBean() instanceof SwaggerConfigResource || action.getBean() instanceof MultipleOpenApiResource
                || action.getBean() instanceof OpenApiResource) {
            return true;
        }

        UserUtil.remove();

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
        // 加上校验放行
        if ("OPTIONS".equals(request.getMethod())) {
            response.setStatus(HttpStatus.OK.value());
            return true;
        }

        // 设置用户信息，从请求头中获取
//        setUserInfo(request);
        return true;
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserUtil.remove();
        LogId.remove();
    }

//    private void setUserInfo(HttpServletRequest request) {
//        // 从请求头中获取token
//        String token = request.getHeader(StringPool.SA_TOKEN);
//        // 从请求头中获取角色
//        String roleId = request.getHeader(StringPool.ROLE_ID);
//
//        if (StrUtil.isBlank(token) || StrUtil.isBlank(roleId)) {
//            Cookie[] cookies = request.getCookies();
//            if (cookies != null) {
//                for (Cookie cookie : cookies) {
//                    if (StringPool.SA_TOKEN.equals(cookie.getName()) && StrUtil.isBlank(token)) {
//                        token = cookie.getValue();
//                        continue;
//                    }
//                    if (StringPool.ROLE_ID.equals(cookie.getName()) && StrUtil.isBlank(roleId)) {
//                        roleId = cookie.getValue();
//                    }
//                }
//            }
//        }
//
//        if (StrUtil.isNotBlank(token) && token.startsWith(StringPool.TOKEN_PREFIX)) {
//            token = token.replaceFirst(StringPool.TOKEN_PREFIX, StringPool.EMPTY_STR);
//        }
//
//        // 用户登录拦截
//        Object loginId = StpUtil.getLoginIdByToken(token);
//        if (Objects.isNull(loginId)) {
//            throw new BusinessException(ExceptionCodeEnum.USER_NOT_LOGIN);
//        }
//
//        log.info("开始获取当前登录用户信息，登录ID为：{}", loginId);
//        // 从数据库查询用户信息
//        SysUserInfo userInfo = getUserInfoFromDb(Long.valueOf(loginId.toString()));
//        userInfo.setToken(token);
//        log.info("校验当前用户角色ID：{}", roleId);
//        if (StrUtil.isNotBlank(roleId)) {
//            // 校验角色
//            List<Long> roleIdList = sysRoleUserService.listRoleIdByUserId(userInfo.id());
//            if (CollUtil.isNotEmpty(roleIdList)) {
//                final String finalRoleId = roleId;
//                boolean matchedRoleId = roleIdList.stream().anyMatch(currentRoleId -> Objects.equals(String.valueOf(currentRoleId), finalRoleId));
//                if (matchedRoleId) {
//                    // 设置角色ID
//                    userInfo.setRoleId(Long.valueOf(roleId));
//                    SysRoleQueryResponse sysRole = sysRoleService.getOneByUniqueKey(userInfo.roleId(), "id");
//                    if (Objects.nonNull(sysRole)) {
//                        // 设置角色数据权限
//                        Integer dataScope = sysRole.getDataScope();
//                        userInfo.setDataScope(dataScope);
//                    }
//                } else {
//                    throw new BusinessException(ExceptionCodeEnum.USER_ROLE_NOT_EXIST);
//                }
//            }
//        }
//        UserUtil.set(userInfo);
//        log.info("当前用户信息初始化完成，当前用户信息为：{}", userInfo.userInfoToString());
//    }


    /**
     * 从数据库中获取用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
//    private SysUserInfo getUserInfoFromDb(Long id) {
//        // 查用户信息
//        SysUserQueryResponse sysUser = sysUserService.getOneByUniqueKey(id, "id");
//        SysUserInfo userInfo = new SysUserInfo();
//        userInfo.setId(sysUser.getId());
//        userInfo.setUsername(sysUser.getUsername());
//        userInfo.setLoginAccount(sysUser.getLoginAccount());
//        userInfo.setEmail(sysUser.getEmail());
//        userInfo.setPhone(sysUser.getPhone());
//        userInfo.setAvatar(sysUser.getAvatar());
//        userInfo.setGender(GenderEnum.of(sysUser.getGender()));
//        userInfo.setStatus(StatusEnum.of(sysUser.getStatus()));
//        userInfo.setAge(sysUser.getAge());
//        userInfo.setBirthday(sysUser.getBirthday());
//        userInfo.setRemark(sysUser.getRemark());
//        userInfo.setCreateUserId(sysUser.getCreateUserId());
//        userInfo.setCreateTime(sysUser.getCreateTime());
//        userInfo.setDeptId(sysUser.getDeptId());
//        if (Objects.nonNull(sysUser.getDeptId())) {
//            log.info("查询当前用户的部门信息，当前用户部门ID为：{}", sysUser.getDeptId());
//            List<SysDept> sysDeptList = sysDeptService.listDeptAndChild(sysUser.getDeptId());
//            List<Long> deptIds = sysDeptList.stream().map(SysDept::getId).toList();
//            userInfo.setDeptIds(deptIds);
//        }
//
//        return userInfo;
//    }
}
